#ifndef _PROTOCOL_LIST_H_
#define _PROTOCOL_LIST_H_

#include <config.h>
#include <stdbool.h>

// 携带报文数据长度
#define MESSAGE_DATA_LENGTH                     NOMINAL_PACKET_LENGTH

/**
 * @brief 数据报文数据结构
 * 
 */
typedef struct __attribute__((aligned(4)))
{
  uint8_t Command;                         // 命令
  uint8_t Response;                        // 应答
  uint8_t DataSource;                      // 数据来源
  uint16_t PacketSize;                     // 报文数据有效长度
  uint32_t TriggerTime;                     // 触发时间
  uint32_t BasisOfSearch;                  // 检索依据
  uint8_t PacketData[MESSAGE_DATA_LENGTH]; // 报文数据
} MessageDataPacket_t;

/**
 * @brief 消息报文表结构
 * 
 */
typedef struct MessageNode
{
  MessageDataPacket_t Message;      // 报文
  struct MessageNode *NextItem;     // 子节点
  struct MessageNode *PreviousItem; // 父节点
} *MessageListNode_t, MessageTable_t;

/**
 * @brief 创建返回链表的头节点
 * 
 * @return AudioListNode_t - 节点
 */
extern MessageListNode_t MessageCreateTableList(void);

/**
 * @brief 双向链表销毁
 * 
 * @param HeadNode - 链表头
 */
extern void MessageListDestory(MessageListNode_t HeadNode);

/**
 * @brief 双向链表查找
 * 
 * @param HeadNode         - 链表头
 * @param TriggerTime       - 触发时间
 * @return AudioListNode_t - 节点
 */
extern MessageListNode_t MessageListFind(MessageListNode_t HeadNode, uint32_t TriggerTime);

/**
 * @brief 实现节点的获取
 * 
 * @param pFileTable       - 资源表
 * @return AudioListNode_t - 节点
 */
extern MessageListNode_t MessageBuyNode(MessageDataPacket_t *pFileTable);

/**
 * @brief 双向链表在pos的前面进行插入
 * 
 * @param Pos        - 位置
 * @param pFileTable - 资源表
 */
extern void MessageInsertionNode(MessageListNode_t Pos, MessageDataPacket_t *pFileTable);

/**
 * @brief 双向链表删除pos位置的节点
 * 
 * @param Pos - 位置
 */
extern void MessageListErase(MessageListNode_t Pos);

/**
 * @brief 双向链表尾插
 * 
 * @param HeadNode   - 链表头
 * @param pFileTable - 资源表
 * @return bool      - 插入状态（true：成功 false：失败）
 */
extern bool MessageListPushBack(MessageListNode_t HeadNode, MessageDataPacket_t *pFileTable);

/**
 * @brief 双向链表尾删
 * 
 * @param HeadNode - 链表头
 */
extern void MessageListPopBack(MessageListNode_t HeadNode);

/**
 * @brief 双向链表头插
 * 
 * @param HeadNode   - 链表头
 * @param pFileTable - 资源表
 */
extern void MessageListPushFront(MessageListNode_t HeadNode, MessageDataPacket_t *pFileTable);

/**
 * @brief 双向链表头删
 * 
 * @param HeadNode - 链表头
 */
extern void MessageListPopFront(MessageListNode_t HeadNode);

/**
 * @brief 双向链表打印
 * 
 * @param HeadNode - 链表头
 */
extern void MessagListPrintf(MessageListNode_t HeadNode);

#endif
